home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / langs / cc68x.zoo / run.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-12-04  |  1.8 KB  |  82 lines

  1. #include <unistd.h>
  2. #include <support.h>
  3. #include <process.h>
  4. #include <stdio.h>
  5. #include "global.h"
  6.  
  7. #define ARG_GRAN    10
  8.  
  9. void add_args(A, arg_list)
  10.   Arguments *A;
  11.   char const * const * arg_list;
  12. {
  13.   register int n;
  14.   register char const * const *p;
  15.   register char const **q;
  16.  
  17.   if (A->_args == 0) {
  18.     A->_args = mallok((A->arg_spc = ARG_GRAN) * sizeof(char *));
  19.     A->nargs = 0;
  20.     A->_args[0] = 0;
  21.   }
  22.   for (n = 0, p = arg_list; *p; n++, p++)
  23.     continue;
  24.   if (A->nargs + n >= A->arg_spc) {
  25.     do
  26.       A->arg_spc *= 2;
  27.     while (A->nargs + n >= A->arg_spc);
  28.     A->_args = reallok(A->_args, (A->arg_spc *= 2) * sizeof (char *));
  29.   }
  30.   for (p = arg_list, q = A->_args + A->nargs; *p; p++, q++)
  31.     *q = *p;
  32.   *q = 0;
  33.   A->nargs += n;
  34. }
  35.  
  36. void add_arg(A, arg)
  37.   Arguments *A;
  38.   const char *arg;
  39. {
  40.   static const char *arg_list[2] = {0, 0};
  41.  
  42.   arg_list[0] = arg;
  43.   add_args(A, arg_list);
  44. }
  45.  
  46. void remove_args(A, n)
  47.   Arguments *A;
  48.   int n;
  49. {
  50.   if (A->nargs < n)
  51.     bugchk("remove %d args from %d-arg stack \"%s\"?", n, A->nargs, args(A)[0]);
  52.   A->nargs -= n;
  53.   A->_args[A->nargs] = 0;
  54. }
  55.  
  56. void run(A, envp)
  57.   Arguments *A;
  58.   char const * const *envp;
  59. {
  60.   const char *prog;
  61.   static char * const exts[] = {"prg", "tos", "ttp", NULL};
  62.  
  63.   if (A->nargs == 0 || args(A) == 0)
  64.     bugchk("execute nothing?");
  65.  
  66.   if (!action || verbose) {
  67.     register const char **p = args(A);
  68.  
  69.     for (; *p; p++)
  70.       printf("%s%c", *p, (p[1] ? ' ' : '\n'));
  71.   }
  72.   if (!action)
  73.     return;
  74.  
  75.   prog = findfile(args(A)[0], getenv("PATH"), exts);
  76.   if (!prog)
  77.     fatal("can't find program %s\n", args(A)[0]);
  78.  
  79.   if (spawnve(P_WAIT, prog, (char * const *)args(A), (char * const *)envp) != 0)
  80.     fatal("error running program %s\n", args(A)[0]);
  81. }
  82.